package com.orderplus.opshop.common.util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * url 匹配等相关工具
 *
 * @author mhj
 */
public class UrlUtil {
	private UrlUtil() {
	}

	/**
	 * uri比较器，基于字符串大小的比较
	 */
	public final static Comparator<String> URI_COMPARATOR = new Comparator<String>() {
		@Override
		public int compare(String o1, String o2) {
			return o1.compareTo(o2);
		}
	};

	/**
	 * 匹配 url
	 *
	 * @param url    uri规则
	 * @param target 需要匹配的目标url
	 * @return 返回匹配中的url
	 */
	public static String matcheUrl(String url, String target) {

		// 步驟 ： 1 先匹配是否相等， 2 匹配 * 号的情况
		int c = url.compareTo(target);
		if (0 == c) {
			// 呵呵
			return url;
		}
		// 匹配 /usm/* 或 /usm/*.jsp 这种
		int idx = url.lastIndexOf('*');
		if (-1 != idx) {
			int didx = url.lastIndexOf("**");
			idx = -1 != didx ? didx : idx;
			int len = -1 != didx ? 2 : 1;
			// 匹配前后缀
			String prefix = url.substring(0, idx);
			String suffix = url.substring(idx + len);
			if ((StringUtil.isEmpty(prefix) || target.startsWith(prefix)) && (StringUtil.isEmpty(suffix) || target.endsWith(suffix))) {
				// 前后缀都匹配上了。

				if (2 == len) {
					return url;
				}
				// 匹配这种 /usm/a/b/*.jsp
				String match = target.substring(prefix.length(), target.length() - suffix.length());
				if (-1 == match.indexOf('/')) {
					return url;
				}
			}
		}
		return null;
	}

	/**
	 * 匹配 url
	 *
	 * @param list   所有uri规则 <b>需要匹配的集合是需要有序的</b>
	 * @param target 需要匹配的目标url
	 * @return 返回匹配中的url
	 */
	public static String matcheUrl(List<String> list, String target) {
		if (null == list || list.size() == 0) {
			return null;
		}

		// 步驟 ： 1 先匹配是否相等， 2 匹配 * 号的情况
		for (int i = 0; i < list.size(); i++) {
			String url = list.get(i);
			int c = url.compareTo(target);
			if (0 == c) {
				// 呵呵
				return url;
			}
			// 匹配 /usm/* 或 /usm/*.jsp 这种
			int idx = url.lastIndexOf('*');
			if (-1 != idx) {
				int didx = url.lastIndexOf("**");
				idx = -1 != didx ? didx : idx;
				int len = -1 != didx ? 2 : 1;
				// 匹配前后缀
				String prefix = url.substring(0, idx);
				String suffix = url.substring(idx + len);
				if ((StringUtil.isEmpty(prefix) || target.startsWith(prefix)) && (StringUtil.isEmpty(suffix) || target.endsWith(suffix))) {
					// 前后缀都匹配上了。

					if (2 == len) {
						return url;
					}
					// 匹配这种 /usm/a/b/*.jsp
					String match = target.substring(prefix.length(), target.length() - suffix.length());
					if (-1 == match.indexOf('/')) {
						return url;
					}
				}
			}

			if (0 < c) {
				// 不太可能匹配上了。
				break;
			}
		}
		return null;
	}

	/**
	 * 拼装url参数
	 *
	 * @param params 参数列表
	 * @param url    原url地址
	 * @return
	 */
	public static String getUrl(Map<String, String> params, String url) throws UnsupportedEncodingException {
		// 添加url参数
		if (params != null) {
			Iterator<String> it = params.keySet().iterator();
			StringBuffer sb = null;
			while (it.hasNext()) {
				String key = it.next();
				String value = params.get(key);
				if (sb == null) {
					sb = new StringBuffer();
					sb.append("?");
				} else {
					sb.append("&");
				}
				sb.append(key);
				sb.append("=");
				sb.append(URLEncoder.encode(value, "UTF-8"));
			}
			url += sb.toString();
		}
		return url;
	}


	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("/*");
		list.add("/sms/abc");
		list.add("/sms/*.jsp");
		list.add("/sms/a/b/*");
		list.add("/ueq/sys/b/*");
		list.add("/ueq/*");
		list.add("/sms/*");
		Collections.sort(list, URI_COMPARATOR);
	}
}
